package com.csap.framework.apidoc.model;

import com.csap.framework.properties.apidoc.ModelType;
import com.csap.framework.properties.apidoc.ParamType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author yangchengfu
 * @description 参数信息
 * @dataTime 2019年-12月-27日 17:00:00
 **/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CsapDocParameter implements Cloneable {

    /**
     * 参数描述
     */
    private String value;
    /**
     * 参数名称
     */
    private String name;
    /**
     * 详细描述
     */
    private String description;
    /**
     * 示例
     */
    private String example;
    /**
     * 默认值
     */
    private String defaultValue;
    /**
     * 是否必须
     */
    private boolean required;

    /**
     * 数据类型
     */
    private String dataType;
    /**
     * 长数据类型
     */
    private String longDataType;

    /**
     * 参数类型
     */
    private ParamType paramType;

    /**
     * 位置
     */
    private int position;
    /**
     * 长度
     */
    private int length;
    /**
     * 小数
     */
    private int decimals;
    /**
     * 当前参数分组
     */
    private Set<String> group;
    /**
     * 当前参数版本
     */
    private Set<String> version;
    /**
     * 引用对象
     */
    private CsapDocModel children;
    /**
     * 对象类型
     */
    private ModelType modelType;
    /**
     * 参数属性列表
     */
    private List<CsapDocParameter> parameters;
    /**
     * 是否有子集
     */
    private Boolean hasChildren = Boolean.FALSE;
    /**
     * 是否强制显示
     */
    private Boolean force = Boolean.FALSE;
    /**
     * 唯一标识
     */
    private String key;
    /**
     * 扩展信息显示
     */
    private List<Map<String, String>> extendDescr;
    /**
     * 是否隐藏
     */
    private Boolean hidden;

    @Override
    protected CsapDocParameter clone() throws CloneNotSupportedException {
        return (CsapDocParameter) super.clone();
    }

    public List<CsapDocParameter> getParameters() {
        return children != null ? children.getParameters() : parameters;
    }
}
